package com.merlin.security.browser;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.authority.AuthorityUtils;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Component;


@Component
public class MyDetailsService implements UserDetailsService {

	private Logger logger = LoggerFactory.getLogger(getClass());
	
	@Autowired
	private PasswordEncoder passwordEncoder;
	
	@Override
	public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
		logger.info("登录用户名："+username);
		//根据用户名查找用户信息(针对每个系统的查询数据不一样，这里需自行去实现，最后将剥离出去)
		
		//根据查找到的用户信息判断用户是否被冻结
		
		String password = passwordEncoder.encode("123456");
		logger.info("数据库密码是: "+password);
		/**
		 * User 对象为Spring 一个对象，也实现了UserDetails接口
		 * 三个参数
		 * 分别是：用户名、密码、权限
		 * 前面两个参数可以对用户信息进行身份认证
		 * 最后一个参数需要告诉SpringSecurity，该用户拥有什么样的权限。
		 * AuthorityUtils.commaSeparatedStringToAuthorityList
		 * 该方法是用来转换一个以逗号隔开的字符串转成一个GrantedAuthority对象的一个集合
		 * return new User(username,"123456",AuthorityUtils.commaSeparatedStringToAuthorityList("admin"));
		 */
		/**
		 * 七个构造方法的
		 * 其中包含用户账号是否过期，是否被锁，密码是否过期，账号是否可用
		 */
		return new User(username,password,
				true,true,true,true,
				AuthorityUtils.commaSeparatedStringToAuthorityList("admin"));
	}
}
